package jsoner

import (
	"bytes"
	"encoding/json"
	"errors"

	"gitee.com/gousing/helper/internal"
)

type jsonStandard struct {
}

func (m *jsonStandard) Valid(v []byte) bool {
	if v == nil {
		return false
	}
	return json.Valid(v)
}
func (m *jsonStandard) Marshal(value any) ([]byte, error) {
	return json.Marshal(value)
}
func (m *jsonStandard) MarshalToString(value any) (string, error) {
	bb, err := json.Marshal(value)
	if err != nil {
		return "", err
	}
	return internal.BytesToString(bb), nil
}
func (m *jsonStandard) MarshalWithoutEscape(value any) ([]byte, error) {
	var bb bytes.Buffer
	enc := json.NewEncoder(&bb)
	enc.SetEscapeHTML(false)
	err := enc.Encode(value)
	if err != nil {
		return []byte{}, err
	}
	// 标准库的Encode/EscapeHTML(false)会多出\n，这里去除\n
	return bytes.TrimSpace(bb.Bytes()), nil
}
func (m *jsonStandard) MarshalToStringWithoutEscape(v any) (string, error) {
	bb, err := m.MarshalWithoutEscape(v)
	if err != nil {
		return "", err
	}
	return internal.BytesToString(bb), nil
}
func (m *jsonStandard) Unmarshal(data []byte, objRef any) error {
	if data == nil {
		return errors.New("unmarshal data<[]byte> is nil")
	}
	if objRef == nil {
		return errors.New("unmarshal objRef<any> is nil")
	}
	return json.Unmarshal(data, objRef)
}
func (m *jsonStandard) UnmarshalFromString(data string, objRef any) error {
	if objRef == nil {
		return errors.New("unmarshalFromString objRef<any> is nil")
	}
	return json.Unmarshal(internal.StringToBytes(data), objRef)
}
